/*
 * Main.java
 *
 * Created on 13 de abril de 2006, 13:31
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package maingen;



import clasesbasicas.Manejador;
import clasesbasicas.Paso;
import grafogen.Arista;
import grafogen.CtrolGrafo;
import grafogen.Grafo;
import grafogen.Nodo;
import grafogen.TablaDecision;
import java.io.*;

import java.util.ArrayList;
import java.util.Vector;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import usecase.UseCaseXML;

/**
 * Test class
 * @author Rincew
 */
public class Main {
    
    
   
    
    //----- graf1 ------------------------
    //-- Generate graf
//    static void creacionGrafo() 
//        throws Exception
//    {
//
//        File f = new File("C:/Users/laura/Desktop/tesis/generacion de casos de prueba/test_gen/CU001-CarInsurance.xml");
//        
//        UseCaseXML uc = new UseCaseXML();
//        uc.load (f);
//        
//        Manejador manager = new Manejador();
//        
//        manager.generate(uc);
//
//        ArrayList<Grafo> listaDeGrafos = new ArrayList<Grafo>();
//        Grafo grafo =  new Grafo();
//        Grafo grafoUnion = new Grafo();
//              
//        for (Paso paso:manager.getListaTotalPasos()){
//            grafo = grafo.armarGrafo(paso.getCausa());
//            if(listaDeGrafos.size() == 0){
//                listaDeGrafos.add(grafo); //el primer grafo siempre entra
//            }else{
//                for(int i=0; i < listaDeGrafos.size(); i++){
//                    grafoUnion = listaDeGrafos.get(i); System.out.println("grafoUnion:"+grafoUnion.toString());
//                    Nodo nodoUlt = grafo.getUltimoNodo(); System.out.println("nodoUlt:"+nodoUlt);
//
//                    grafoUnion = CtrolGrafo.unionGraf(nodoUlt, grafo, grafoUnion);
//
//                    if( grafoUnion.isUnion() ){
//                        grafo = grafoUnion;
//                        listaDeGrafos.remove(i);
//                    }
//                }
//
//                listaDeGrafos.add(grafo);
//            }
//
////            System.out.println("Causa: "+paso.getCausa());
////            System.out.println("Efecto: "+paso.getEfecto());
//        }
//        
//    }
    /**
     * @param args the command line arguments
     */
    public static void main (String[] args) 
        throws Exception
    {
        
        //--- Configure logs -----------
        BasicConfigurator.configure ();
        PropertyConfigurator.configure(/*path+*/"./config/logs.prop");
        configuration.Configuration.Create ();

//        //--- Prueba de grafo -----------
//        creacionGrafo();

          //String sentenciaUno = "( c1 )";
//          String sentenciaDos = "( c3 or c4 )";
//          String sentenciaTres = "( c1 and c3 )";

          //String sentenciaUno = "( C or ( A and B ) )";
          //String sentenciaUno = "( C or ( A and B ) and ( D and ( E or F ) ) )";
          //String sentenciaUno = "( D and ( E or F ) and ( C or ( A and B ) ) )";
          //String sentenciaUno = "( c1 or c2 or ( c5 and ( c3 or c4 ) ) )";
          //String sentenciaUno = "( c3 or ( c1 and c2 ) and ( c4 and c5 ) or ( c6 or ( c7 and c8 ) ) )";
          //String sentenciaUno = "( ( c1 or c2 ) or c3 )";
          //String sentenciaUno = "( ( ( c3 or ( c1 and c2 ) ) and ( c4 and c5 ) ) or ( c6 or ( c7 and c8 ) ) )";
          //String pasos[] = new String[2];
          //String pasos[] = new String[1];
          //pasos[0] = sentenciaUno;
          //pasos[1] = sentenciaDos;


          //String efectos[] = new String[2];
//          String efectos[] = new String[1];
//          efectos[0] = "e1";
          //efectos[1] = "e2";
        
        
        File file = new File("C:/Users/laura/Desktop/tesis/generacion de casos de prueba/test_gen/CU001-CarInsurance.xml");

        UseCaseXML uc = new UseCaseXML();
        uc.load(file);

        Manejador manager = new Manejador();

        manager.generate(uc);

        ArrayList<Grafo> listaDeGrafos = new ArrayList<Grafo>();
        Grafo grafo = new Grafo();
        
         for (Paso paso:manager.getListaTotalPasos()){ 
                System.out.println("paso.getCausa() "+paso.getCausa());
            grafo = grafo.armarGrafo(paso.getCausa());
            int cantNodos = grafo.getNodos().size();
            Nodo nodoEf = new Nodo(cantNodos+1, paso.getEfecto(), "efecto");
            grafo.agregarNodo(nodoEf);

            int cantAristas = grafo.getAristas().size();
            Arista aristaEf = new Arista(cantAristas+1, grafo.getUltimoNodo(), nodoEf);
            grafo.agregarArista(aristaEf);


            if(listaDeGrafos.size() == 0){
                
                grafo.reenumerarNodos();
                
//                int contOpe = 0;
//                int contCau = 0;
//                for (Nodo nodo : grafo.getNodos()) {
//
//                    if ("operador".equalsIgnoreCase(nodo.getTipo())) {
//                        nodo.setCodigoN(contOpe++);
//                    } else if ("causa".equalsIgnoreCase(nodo.getTipo())) {
//                        nodo.setCodigoN(contCau++);
//                    }
//
//                }

                listaDeGrafos.add(grafo); //el primer grafo siempre entra
            }else{
                //si existen grafos debo verificar si alguno puede unirse con el nuevo grafo
                ArrayList<Grafo> listaAux = Grafo.cloneList(listaDeGrafos);

                for(int i=0; i < listaDeGrafos.size(); i++){

                    Grafo grafoUnion = (Grafo)listaAux.get(i); 
                    //grafoUnion.setUltimoNodo(null);
                    
                    System.out.println("grafoUnion:"+grafoUnion.getAristas());
                    System.out.println("grafo:"+grafo.getAristas());
                    Grafo grafoAux = CtrolGrafo.unionPrincipalGraf(grafo,grafoUnion);

                    if (grafoAux.isUnion()) {
                        grafo = grafoAux;

                        listaDeGrafos.remove(i);
                        listaAux.remove(i);
                        i = i-1; //i = i-1 no es igual a i = -1 :-/
                    }
                }

                grafo.reenumerarNodos();
                
                listaDeGrafos.add(listaDeGrafos.size(), grafo);
            }

        }

        if (listaDeGrafos.size() > 0) {

            int c = 0;
            for (Grafo g : listaDeGrafos) {
                CtrolGrafo.graficar(listaDeGrafos.get(c),c);

               System.out.println("Grafo " + c + " Despues:");
//                int contOpe=0;
//                int contCau=0;

//                for (Nodo nodo : g.getNodos()) {
////
////                    if("operador".equalsIgnoreCase(nodo.getTipo()))
////                        nodo.setCodigoN(contOpe++);
////                    else if("causa".equalsIgnoreCase(nodo.getTipo()))
////                        nodo.setCodigoN(contCau++);
//                    
// //                   System.out.println(nodo.getDescripcion()+"-"+ nodo.getCodigoN());
//                }
//
//                for (Arista arista : g.getAristas()) {
// //                   System.out.println("[" + arista.getOrigen().getDescripcion()+"-"+arista.getOrigen().getCodigoN() + "," + arista.getDestino().getDescripcion()+"-"+arista.getDestino().getCodigoN() + "]");
//                }

   //             System.out.println("UltNodo: " + g.getUltimoNodo().getDescripcion());

                c++;
            }
        }

        //armar el grafo

        if (listaDeGrafos.size() > 0) {
            ArrayList<ArrayList<TablaDecision>> listaDeTablasDecision = new ArrayList<ArrayList<TablaDecision>>();
            
            for (Grafo g : listaDeGrafos) {
                listaDeTablasDecision.add(CtrolGrafo.armarTablaDecision(g));
            }

            for(int c=0; c < listaDeTablasDecision.size(); c++){
                
                ArrayList<TablaDecision> listaTabla = listaDeTablasDecision.get(c);
                
                for(int j=0; j < listaTabla.size(); j++){
                    //todas las columnas de la tabla tienen el mismo tamaño
                    TablaDecision t = listaTabla.get(j);
                    
                    for(int k=0; k < t.getTabla().get(0).size(); k++){
                        System.out.print(t.getCausasEfecto().get(k)+"\t");
                        for(int f=0; f < t.getTabla().size(); f++){
                            System.out.print(t.getTabla().get(f).get(k) +"\t");
                        }
                        System.out.print("\n");
                    }    
                }
                System.out.print("------\n");
            }
        }

          
    }


    
}
